# -*-coding:utf-8 -*-
from django.shortcuts import render,redirect
#导包
from django.http import HttpResponse,HttpResponseRedirect,JsonResponse
#导入类视图
from django.views import View

#from myapp.models import User
import json
from django.core.serializers import serialize
from rest_framework.response import Response
from rest_framework.views import APIView
#导入加密库
import hashlib
#导入图片库
#绘画库
from PIL import ImageDraw
#字体库
from PIL import ImageFont
#图片库
from PIL import Image
#随机库
import random
#文件流
import io

import requests

#导入上传文件夹配置
from mydjango.settings import UPLOAD_ROOT
import os

#导入原生sql模块
from django.db import connection

import jwt

#导入redis数据库
import redis

#导入时间模块
import time

#导入公共目录变量
from mydjango.settings import BASE_DIR

#导包
from django.db.models import Q,F

#导入dwebsocket的库
from dwebsocket.decorators import accept_websocket
import uuid



from myapp.models import *

#定义 Redis 
host = '127.0.0.1'
port =6379
#建立redis连接
r = redis.Redis(host=host,port=port)


from django.utils.deprecation import MiddlewareMixin
#自定义中间件类
class MyMiddleWare(MiddlewareMixin):
 
    #请求之前
    def process_request(self,request):
        # uid= request.GET.get('uid')
        # client_jwt = request.GET.get('jwt',None)
        # if client_jwt == None:
        #     return HttpResponse('你没有带上令牌')

        # #解码
        # decode_jwt = jwt.decode(client_jwt,'123',algorithms=['HS256'])

        # if decode_jwt['uid'] != str(uid):
        #     return HttpResponse('你篡改了用户id')
        # print(uid)
        # print("请求之前")
        # return HttpResponse('你篡改你用户id')
        pass
       
    #模板渲染之前
    def process_view(self,request,view_fun,view_args,view_kwargs):
        pass
    #请求之后
    def process_response(self,request,Response):
        return Response


#装饰器
def my_decorator(func):
    def wrapper(request,*args,**kwargs):
        # print('这个装饰器被调用了')
        # print('请求接口地址%s'%request.path)

        # #判断jwt逻辑
        # uid= request.GET.get('uid')
        # client_jwt = request.GET.get('jwt',None)

        # #解码
        # decode_jwt = jwt.decode(client_jwt,'123',algorithms=['HS256'])

        # if decode_jwt['uid'] != str(uid):
        #     return HttpResponse('你篡改了用户id')
        return func(request,*args,**kwargs)
    return wrapper

#类装饰器调用
from django.utils.decorators import method_decorator



from myapp.myser import *
#用户信息类
class UserInfo(APIView):
    #装饰器定义
    @method_decorator(my_decorator)

    def get(self,request):
        uid = request.GET.get('uid')
        #查询数据
        user = User.objects.get(id=int(uid))
        #序列化对象
        user_ser = UserSer(user)
        return Response(user_ser.data)




#更新用户数据
class UpdateUser(APIView):
    def get(self,request):
        img = request.GET.get('img')
        uid = request.GET.get('uid')
        #查询数据
        user = User.objects.get(id=int(uid))
        user.img = img 
        user.save()

        return Response({'code':200,"message":"更新成功"})





#定义七牛云存储接口
from qiniu import Auth 
class QiNiu(APIView):
    def get(self,request):
        q =  Auth('cqa3XXv9g3F_vCVw5vBuWk8FUjV1evJlFZBDQedW','YjYcETJ1_g-J5EHIrk6KkNnrTgnLnGHKvOH4Ms5D')
        #指定上传空间
        token = q.upload_token('md2')
        print(token)

        res = {}
        res['token'] = token 
        return Response(res)




#上传视图类
#上传文件
class UploadFile(View):

	def post(self,request):

		#接收参数
		img = request.FILES.get("file")

		#建立文件流对象
		f = open(os.path.join(UPLOAD_ROOT,'',img.name),'wb')

		#写入服务器端
		for chunk in img.chunks():
			f.write(chunk)
		f.close()

		#返回文件名
		return HttpResponse(json.dumps({'filename':img.name},ensure_ascii=False),content_type='application/json')





import time
import hmac
import base64
from hashlib import sha256
import urllib
import json


#构造钉钉回调方法
def ding_back(request):

    #获取code
    code = request.GET.get("code")

    t = time.time()
    #时间戳
    timestamp = str((int(round(t * 1000))))
    appSecret ='ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160'
    #构造签名
    signature = base64.b64encode(hmac.new(appSecret.encode('utf-8'),timestamp.encode('utf-8'), digestmod=sha256).digest())
    #请求接口，换取钉钉用户名
    payload = {'tmp_auth_code':code}
    headers = {'Content-Type': 'application/json'}
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature='+urllib.parse.quote(signature.decode("utf-8"))+"&timestamp="+timestamp+"&accessKey=dingoaukgkwqknzjvamdqh",data=json.dumps(payload),headers=headers)

    res_dict = json.loads(res.text)
    # res_dict1 = eval(res_dict)
    print(res_dict)
    x = len(res_dict)
    print(x)
    #取出nick的值
    print(res_dict['user_info']['nick'])

    #判断是否用钉钉登录过
    dingding = User.objects.filter(username=str(res_dict['user_info']['nick'])).first()

    dingding_id = ""
    use_id = ""

    if dingding:
        #代表曾经登录过
        dingding_id = dingding.username
        use_id = dingding.id

    else:
        #自动创建账号 入库操作
        dingding = User(username=str(res_dict['user_info']['nick']),password="",type=0)

        #保存
        dingding.save()

        #查询用户id
        dingding = User.objects.filter(username=str(res_dict['user_info']['nick'])).first()

        dingding_id = str(res_dict['user_info']['nick'])
        use_id = dingding.id
    


    #将返回的数据进行解码
  
    return redirect('http://localhost:8080?dingding_id='+str(dingding_id)+"&uid="+str(use_id)) 




#新浪微博回调
def wb_back(request):

	 #获取code
    code = request.GET.get('code')

    #换取网址
    access_token_url = "https://api.weibo.com/oauth2/access_token"

    #发送请求进行换取
    res = requests.post(
        access_token_url,
        data={
            "client_id": '1837903328',
            "client_secret": "e744550929f2f5182aad8fd2cc897de6",
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": "http://127.0.0.1:8000/md_admin/weibo"
        }
    )

    #转换类型
    res = json.loads(res.text)

    #换取新浪微博昵称 json
    result = requests.get("https://api.weibo.com/2/users/show.json",params={'access_token':res['access_token'],'uid':res['uid']})

    print(result.text)

    result = json.loads(result.text)

    

    #判断该用户是否曾经登录过
    user = User.objects.filter(username=str(result['name'])).first()

    sina_id = ""
    user_id = ""

    if user: 
        sina_id = user.username
        user_id = user.id
    else:
        #手动创建账号
        user = User(username=str(result['name']),password="",img='',type=0)
        user.save()

        sina_id = result['name']
        #查询一下刚刚入库的新账号
        user = User.objects.filter(username=str(result['name'])).first()
        user_id = user.id




    # return HttpResponse(result['name'])

    # #进行跳转
    return redirect('http://localhost:8080?sina_id='+sina_id+"&uid="+str(user_id))
    


#定义验证码类
#导入验证码
class MyCode(View):
    #定义随机验证颜色
    def get_random_color(self):
        R = random.randrange(255)
        G = random.randrange(255)
        B = random.randrange(255)
        return (R,G,B)

    #随机验证码
    def get(self,request):
        #画布
        img_size= (120,50)
        image = Image.new("RGB",img_size,'white')
        #画笔
        draw = ImageDraw.Draw(image,'RGB')
        #定义随机字符串
        source = "角度看斯拉夫打开撒酒疯"
        
        #容器，用来接受随机字符串
        code_str = ''
        myfont = ImageFont.truetype(font="C:\\Users\\Samsung\\Documents\\文档\\bb42_downcc.com\\bb42_downcc.com\\bb42\\039方正喵呜体\\FZMWFont.ttf",size=15)
        for i in range(4):
            #获取字体随机颜色
            text_color = self.get_random_color()
            #获取字符串
            tmp_num = random.randrange(len(source))
            #获取字符集
            random_str = source[tmp_num]
            #添加到容器中
            code_str += random_str
            #绘制
            draw.text((10+30*i,20),random_str,text_color,font=myfont)
        #实现文件流的形式
        buf = io.BytesIO()
        #将图片保存到缓冲区 
        image.save(buf,'png')
        #将随机码存储到redis中
        r.set('code',code_str)
        #将验证码存储到session中
        request.session['code'] = code_str

        return HttpResponse(buf.getvalue(),'image/png')




    





#md5加密方法
def make_password(mypass):
    #生成md5对象
    md5 = hashlib.md5()
    #定义机密对象
    sign_str = str(mypass)
    #转码
    sign_utf8 = sign_str.encode(encoding="utf-8")
    #加密
    md5.update(sign_utf8)
    #生成密钥串
    md5_server = md5.hexdigest()

    return md5_server

#注册模块
class Register(APIView):
    def get(self,request):

        #接受参数
        username = request.GET.get('username','null')
        password = request.GET.get('password','mull')
        code = request.GET.get('code','mull')


        print(username)
        print(password)

        #获取验证码
        redis_code = r.get('code')
        redis_code = redis_code.decode('utf-8')
        print(redis_code)

        # 从session 中获取验证码
        session_code = request.session.get('code',None)
        print(session_code)
        # print(code,'*****')
        print("session:%s"%str(session_code))


        #判断验证码是否正确
        if code!= redis_code:
            res = {}
            res['code'] = 405
            res['message'] = '验证码输入错误'
            return Response(res)


        #排重
        user = User.objects.filter(username=username).first()

        if user:
            res = {}
            res['code'] = 405
            res['message'] = "该用户名已存在"
            return Response(res)

        #入库
        user = User(username=username,password=make_password(password),img='',type=0)
        user.save()

        res = {}
        res['code'] = 200
        res['message'] = "恭喜，注册成功"

        return Response(res)

#登录
class Login(APIView):
    def get(self,request):
        resp = {}

        #获取用户名和密码
        username = request.GET.get('username')
        password = request.GET.get('password')


        #判断用户名是否存在
        user = User.objects.filter(username=username,password=make_password(password)).first()
        if user:
            #判断密码是否正确
            resp['code'] = 200 
            resp['message'] = '登录成功'
            resp['username'] = username
            resp['password']  = password
            resp['uid'] = user.id 
            encode_jwt = jwt.encode({"uid":str(user.id)},'123',algorithm='HS256')
            print(encode_jwt)
            #解码
            #强转
            encode_str = str(encode_jwt,'utf-8')
            resp['jwt'] = encode_str
        else:
            resp['code'] = 405
            resp['message'] = '用户名和密码错误'

        return Response(resp)
            

#md5加密方法
def make_password(mypass):
    #生成md5对象
    md5 = hashlib.md5()
    #定义机密对象
    sign_str = str(mypass)
    #转码
    sign_utf8 = sign_str.encode(encoding="utf-8")
    #加密
    md5.update(sign_utf8)
    #生成密钥串
    md5_server = md5.hexdigest()

    return md5_server
class UpdatePassword(APIView):
   
    def get(self, request):
        uid = request.GET.get('uid')
        password = request.GET.get('password')
        User.objects.filter(id=uid).update(password=make_password(password))
        return Response({
            'code': 200,
            'message': '修改成功'
        })